<!--{
	"Title": "Go 1.16 Release Notes",
	"Path":  "/doc/go1.16"
}-->

<!--
NOTE: In this document and others in this directory, the convention is to
set fixed-width phrases with non-fixed-width spaces, as in
<code>hello</code> <code>world</code>.
Do not send CLs removing the interior tags from such phrases.
-->

<style>
  main ul li { margin: 0.5em 0; }
</style>

<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.16</h2>

<p>
  <strong>
    Go 1.16 is not yet released. These are work-in-progress
    release notes. Go 1.16 is expected to be released in February 2021.
  </strong>
</p>

<h2 id="language">Changes to the language</h2>

<p>
  TODO
</p>

<h2 id="ports">Ports</h2>

<h3 id="darwin">Darwin</h3>

<p><!-- golang.org/issue/38485, golang.org/issue/41385, CL 266373, more CLs -->
  Go 1.16 adds support of 64-bit ARM architecture on macOS (also known as
  Apple Silicon) with <code>GOOS=darwin</code>, <code>GOARCH=arm64</code>.
  Like the <code>darwin/amd64</code> port, the <code>darwin/arm64</code>
  port supports cgo, internal and external linking, <code>c-archive</code>,
  <code>c-shared</code>, and <code>pie</code> build modes, and the race
  detector.
</p>

<p><!-- CL 254740 -->
  The iOS port, which was previously <code>darwin/arm64</code>, is now
  moved to <code>ios/arm64</code>. <code>GOOS=ios</code> implies the
  <code>darwin</code> build tag, just as <code>GOOS=android</code>
  implies the <code>linux</code> build tag.
</p>

<p><!-- golang.org/issue/42100, CL 263798 -->
  The <code>ios/amd64</code> port is added, targetting the iOS simulator
  running on AMD64-based macOS.
</p>

<h3 id="netbsd">NetBSD</h3>

<p><!-- golang.org/issue/30824 -->
  Go now supports the 64-bit ARM architecture on NetBSD (the
  <code>netbsd/arm64</code> port).
</p>

<h3 id="386">386</h3>

<p><!-- golang.org/issue/40255, golang.org/issue/41848, CL 258957, and CL 260017 -->
  As <a href="go1.15#386">announced</a> in the Go 1.15 release notes,
  Go 1.16 drops support for x87 mode compilation (<code>GO386=387</code>).
  Support for non-SSE2 processors is now available using soft float
  mode (<code>GO386=softfloat</code>).
  Users running on non-SSE2 processors should replace <code>GO386=387</code>
  with <code>GO386=softfloat</code>.
</p>

<h2 id="tools">Tools</h2>

<p>
  TODO
</p>

<h3 id="go-command">Go command</h3>

<h4 id="modules">Modules</h4>

<p><!-- golang.org/issue/41330 -->
  Module-aware mode is enabled by default, regardless of whether a
  <code>go.mod</code> file is present in the current working directory or a
  parent directory. Specifically, the <code>GO111MODULE</code> environment
  variable now defaults to <code>on</code>. To switch to the previous behavior,
  set <code>GO111MODULE</code> to <code>auto</code>.
</p>

<p><!-- golang.org/issue/40728 -->
  Build commands like <code>go</code> <code>build</code> and <code>go</code>
  <code>test</code> no longer modify <code>go.mod</code> and <code>go.sum</code>
  by default. Instead, they report an error if a module requirement or checksum
  needs to be added or updated (as if the <code>-mod=readonly</code> flag were
  used). Module requirements and sums may be adjusted with <code>go</code>
  <code>mod</code> <code>tidy</code> or <code>go</code> <code>get</code>.
</p>

<p><!-- golang.org/issue/40276 -->
  <code>go</code> <code>install</code> now accepts arguments with
  version suffixes (for example, <code>go</code> <code>install</code>
  <code>example.com/cmd@v1.0.0</code>). This causes <code>go</code>
  <code>install</code> to build and install packages in module-aware mode,
  ignoring the <code>go.mod</code> file in the current directory or any parent
  directory, if there is one. This is useful for installing executables without
  affecting the dependencies of the main module.
</p>

<p><!-- golang.org/issue/40276 -->
  <code>go</code> <code>install</code>, with or without a version suffix (as
  described above), is now the recommended way to build and install packages in
  module mode. <code>go</code> <code>get</code> should be used with the
  <code>-d</code> flag to adjust the current module's dependencies without
  building packages, and use of <code>go</code> <code>get</code> to build and
  install packages is deprecated. In a future release, the <code>-d</code> flag
  will always be enabled.
</p>

<p><!-- golang.org/issue/24031 -->
  <code>retract</code> directives may now be used in a <code>go.mod</code> file
  to indicate that certain published versions of the module should not be used
  by other modules. A module author may retract a version after a severe problem
  is discovered or if the version was published unintentionally.<br>
</p>

<p><!-- golang.org/issue/26603 -->
  The <code>go</code> <code>mod</code> <code>vendor</code>
  and <code>go</code> <code>mod</code> <code>tidy</code> subcommands now accept
  the <code>-e</code> flag, which instructs them to proceed despite errors in
  resolving missing packages.
</p>

<p><!-- golang.org/issue/36465 -->
  The <code>go</code> command now ignores requirements on module versions
  excluded by <code>exclude</code> directives in the main module. Previously,
  the <code>go</code> command used the next version higher than an excluded
  version, but that version could change over time, resulting in
  non-reproducible builds.
</p>

<h4 id="go-test"><code>go</code> <code>test</code></h4>

<p><!-- golang.org/issue/29062 -->
  When using <code>go</code> <code>test</code>, a test that
  calls <code>os.Exit(0)</code> during execution of a test function
  will now be considered to fail.
  This will help catch cases in which a test calls code that calls
  <code>os.Exit(0)</code> and thereby stops running all future tests.
  If a <code>TestMain</code> function calls <code>os.Exit(0)</code>
  that is still considered to be a passing test.
</p>

<p><!-- golang.org/issue/39484 -->
  <code>go</code> <code>test</code> reports an error when the <code>-c</code>
  or <code>-i</code> flags are used together with unknown flags. Normally,
  unknown flags are passed to tests, but when <code>-c</code> or <code>-i</code>
  are used, tests are not run.
</p>

<h4 id="go-get"><code>go</code> <code>get</code></h4>

<p><!-- golang.org/issue/37519 -->
  The <code>go</code> <code>get</code> <code>-insecure</code> flag is
  deprecated and will be removed in a future version. This flag permits
  fetching from repositories and resolving custom domains using insecure
  schemes such as HTTP, and also bypassess module sum validation using the
  checksum database. To permit the use of insecure schemes, use the
  <code>GOINSECURE</code> environment variable instead. To bypass module
  sum validation, use <code>GOPRIVATE</code> or <code>GONOSUMDB</code>.
  See <code>go</code> <code>help</code> <code>environment</code> for details.
</p>

<p><!-- golang.org/cl/263267 -->
  <code>go</code> <code>get</code> <code>example.com/mod@patch</code> now
  requires that some version of <code>example.com/mod</code> already be
  required by the main module.
  (However, <code>go</code> <code>get</code> <code>-u=patch</code> continues
  to patch even newly-added dependencies.)
</p>

<h4 id="govcs"><code>GOVCS</code> environment variable</h4>

<p><!-- golang.org/issue/266420 -->
  <code>GOVCS</code> is a new environment variable that limits which version
  control tools the <code>go</code> command may use to download source code.
  This mitigates security issues with tools that are typically used in trusted,
  authenticated environments. By default, <code>git</code> and <code>hg</code>
  may be used to download code from any repository. <code>svn</code>,
  <code>bzr</code>, and <code>fossil</code> may only be used to download code
  from repositories with module paths or package paths matching patterns in
  the <code>GOPRIVATE</code> environment variable. See
  <a href="/cmd/go/#hdr-Controlling_version_control_with_GOVCS"><code>go</code>
  <code>help</code> <code>vcs</code></a> for details.
</p>

<h4 id="all-pattern">The <code>all</code> pattern</h4>

<p><!-- golang.org/cl/240623 -->
  When the main module's <code>go.mod</code> file
  declares <code>go</code> <code>1.16</code> or higher, the <code>all</code>
  package pattern now matches only those packages that are transitively imported
  by a package or test found in the main module. (Packages imported by <em>tests
  of</em> packages imported by the main module are no longer included.) This is
  the same set of packages retained
  by <code>go</code> <code>mod</code> <code>vendor</code> since Go 1.11.
</p>

<h4 id="toolexec">The <code>-toolexec</code> build flag</h4>

<p><!-- golang.org/cl/263357 -->
  When the <code>-toolexec</code> build flag is specified to use a program when
  invoking toolchain programs like compile or asm, the environment variable
  <code>TOOLEXEC_IMPORTPATH</code> is now set to the import path of the package
  being built.
</p>

<h4 id="i-flag">The <code>-i</code> build flag</h4>

<p><!-- golang.org/issue/41696 -->
  The <code>-i</code> flag accepted by <code>go</code> <code>build</code>,
  <code>go</code> <code>install</code>, and <code>go</code> <code>test</code> is
  now deprecated. The <code>-i</code> flag instructs the <code>go</code> command
  to install packages imported by packages named on the command line. Since
  the build cache was introduced in Go 1.10, the <code>-i</code> flag no longer
  has a significant effect on build times, and it causes errors when the install
  directory is not writable.
</p>

<h4 id="list-buildid">The <code>list</code> command</h4>

<p><!-- golang.org/cl/263542 -->
  When the <code>-export</code> flag is specified, the <code>BuildID</code>
  field is now set to the build ID of the compiled package. This is equivalent
  to running <code>go</code> <code>tool</code> <code>buildid</code> on
  <code>go</code> <code>list</code> <code>-exported</code> <code>-f</code> <code>{{.Export}</code>,
  but without the extra step.
</p>

<h3 id="cgo">Cgo</h3>

<p><!-- CL 252378 -->
  The <a href="/cmd/cgo">cgo</a> tool will no longer try to translate
  C struct bitfields into Go struct fields, even if their size can be
  represented in Go. The order in which C bitfields appear in memory
  is implementation dependent, so in some cases the cgo tool produced
  results that were silently incorrect.
</p>

<h3 id="vet">Vet</h3>

<p>
  TODO

  <!-- CL 235677: https://golang.org/cl/235677: cmd/vet: bring in pass to catch invalid uses of testing.T in goroutines -->
</p>

<h2 id="runtime">Runtime</h2>

<p>
  TODO
</p>

<p><!-- CL 267100 -->
  On Linux, the runtime now defaults to releasing memory to the
  operating system promptly (using <code>MADV_DONTNEED</code>), rather
  than lazily when the operating system is under memory pressure
  (using <code>MADV_FREE</code>). This means process-level memory
  statistics like RSS will more accurately reflect the amount of
  physical memory being used by Go processes. Systems that are
  currently using <code>GODEBUG=madvdontneed=1</code> to improve
  memory monitoring behavior no longer need to set this environment
  variable.
</p>

<h2 id="compiler">Compiler</h2>

<p>
  TODO
</p>

<h2 id="linker">Linker</h2>

<p><!-- CL 248197 -->
  This release includes additional improvements to the Go linker,
  reducing linker resource usage (both time and memory) and improving
  code robustness/maintainability. These changes form the second half
  of a two-release project to
  <a href="https://golang.org/s/better-linker">modernize the Go
  linker</a>.
</p>

<p>
  The linker changes in 1.16 extend the 1.15 improvements to all
  supported architecture/OS combinations (the 1.15 performance improvements
  were primarily focused on <code>ELF</code>-based OSes and
  <code>amd64</code> architectures).  For a representative set of
  large Go programs, linking is 20-35% faster than 1.15 and requires
  5-15% less memory on average for <code>linux/amd64</code>, with larger
  improvements for other architectures and OSes.
</p>

<p>
  TODO: update with final numbers later in the release.
</p>

<p><!-- CL 255259 -->
  On Windows, <code>go build -buildmode=c-shared</code> now generates Windows
  ASLR DLLs by default. ASLR can be disabled with <code>--ldflags=-aslr=false</code>.
</p>

<h2 id="library">Core library</h2>

<p>
  TODO: mention significant additions like new packages (<code>io/fs</code>),
  new proposal-scoped features (<code>//go:embed</code>), and so on
</p>

<p>
  TODO: when the "Minor changes to the library" section is close to completion,
  decide if any changes are worth factoring out and highlighting in "Core library"
</p>

<h3 id="minor_library_changes">Minor changes to the library</h3>

<p>
  As always, there are various minor changes and updates to the library,
  made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
  in mind.
</p>

<p>
  TODO: complete this section, resolve TODOs below, add missing entries
</p>

<dl id="crypto/dsa"><dt><a href="/pkg/crypto/dsa/">crypto/dsa</a></dt>
  <dd>
    <p><!-- CL 257939 -->
      The <a href="/pkg/crypto/dsa/"><code>crypto/dsa</code></a> package is now deprecated.
      See <a href="https://golang.org/issue/40337">issue #40337</a>.
    </p>
  </dd>
</dl><!-- crypto/dsa -->

<dl id="crypto/hmac"><dt><a href="/pkg/crypto/hmac/">crypto/hmac</a></dt>
  <dd>
    <p><!-- CL 261960 -->
      <a href="/pkg/crypto/hmac/#New">New</a> will now panic if separate calls to
      the hash generation function fail to return new values. Previously, the
      behavior was undefined and invalid outputs were sometimes generated.
    </p>
  </dd>
</dl><!-- crypto/hmac -->

<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
  <dd>
    <p><!-- CL 256897 -->
      I/O operations on closing or closed TLS connections can now be detected using
      the new <a href="/pkg/net/#ErrClosed">ErrClosed</a> error. A typical use
      would be <code>errors.Is(err, net.ErrClosed)</code>. In earlier releases
      the only way to reliably detect this case was to match the string returned
      by the <code>Error</code> method with <code>"tls: use of closed connection"</code>.
    </p>

    <p><!-- CL 266037 -->
      A default deadline is set in <a href="/pkg/crypto/tls/#Conn.Close">Close</a>
      before sending the close notify alert, in order to prevent blocking
      indefinitely.
    </p>

    <p><!-- CL 246338 -->
      <a href="/pkg/crypto/tls#Conn.HandshakeContext">(*Conn).HandshakeContext</a> was added to
      allow the user to control cancellation of an in-progress TLS Handshake.
      The context provided is propagated into the
      <a href="/pkg/crypto/tls#ClientHelloInfo">ClientHelloInfo</a>
      and <a href="/pkg/crypto/tls#CertificateRequestInfo">CertificateRequestInfo</a>
      structs and accessible through the new
      <a href="/pkg/crypto/tls#ClientHelloInfo.Context">(*ClientHelloInfo).Context</a>
      and
      <a href="/pkg/crypto/tls#CertificateRequestInfo.Context">
        (*CertificateRequestInfo).Context
      </a> methods respectively. Canceling the context after the handshake has finished
      has no effect.
    </p>

    <p><!-- CL 239748 -->
      Clients now ensure that the server selects
      <a href="/pkg/crypto/tls/#ConnectionState.NegotiatedProtocol">
      an ALPN protocol</a> from
      <a href="/pkg/crypto/tls/#Config.NextProtos">
      the list advertised by the client</a>.
    </p>

    <p><!-- CL 262857 -->
      TLS servers will now prefer other AEAD cipher suites (such as ChaCha20Poly1305)
      over AES-GCM cipher suites if either the client or server doesn't have AES hardware
      support, unless the application set both
      <a href="/pkg/crypto/tls/#Config.PreferServerCipherSuites"><code>Config.PreferServerCipherSuites</code></a>
      and <a href="/pkg/crypto/tls/#Config.CipherSuites"><code>Config.CipherSuites</code></a>
      or there are no other AEAD cipher suites supported.
      The client is assumed not to have AES hardware support if it does not signal a
      preference for AES-GCM cipher suites.
    </p>

    <p><!-- CL 246637 -->
      TODO: <a href="https://golang.org/cl/246637">https://golang.org/cl/246637</a>: make config.Clone return nil if the source is nil
    </p>
  </dd>
</dl><!-- crypto/tls -->

<dl id="crypto/x509"><dt><a href="/pkg/crypto/x509/">crypto/x509</a></dt>
  <dd>
    <p><!-- CL 235078 -->
      <a href="/pkg/crypto/x509/#ParseCertificate">ParseCertificate</a> and
      <a href="/pkg/crypto/x509/#CreateCertificate">CreateCertificate</a> both
      now enforce string encoding restrictions for the fields <code>DNSNames</code>,
      <code>EmailAddresses</code>, and <code>URIs</code>. These fields can only
      contain strings with characters within the ASCII range.
    </p>

    <p><!-- CL 259697 -->
      <a href="/pkg/crypto/x509/#CreateCertificate">CreateCertificate</a> now
      verifies the generated certificate's signature using the signer's
      public key. If the signature is invalid, an error is returned, instead
      of a malformed certificate.
    </p>

    <p><!-- CL 233163 -->
      A number of additional fields have been added to the
      <a href="/pkg/crypto/x509/#CertificateRequest">CertificateRequest</a> type.
      These fields are now parsed in <a href="/pkg/crypto/x509/#ParseCertificateRequest">ParseCertificateRequest</a>
      and marshalled in <a href="/pkg/crypto/x509/#CreateCertificateRequest">CreateCertificateRequest</a>.
    </p>

    <p><!-- CL 257939 -->
      DSA signature verification is no longer supported. Note that DSA signature
      generation was never supported.
      See <a href="https://golang.org/issue/40337">issue #40337</a>.
    </p>

    <p><!-- CL 257257 -->
      On Windows, <a href="/pkg/crypto/x509/#Certificate.Verify"><code>Certificate.Verify</code></a>
      will now return all certificate chains that are built by the platform
      certificate verifier, instead of just the highest ranked chain.
    </p>

    <p><!-- CL 262343 -->
      TODO: <a href="https://golang.org/cl/262343">https://golang.org/cl/262343</a>: add Unwrap to SystemRootsError
    </p>
  </dd>
</dl><!-- crypto/x509 -->

<dl id="encoding/json"><dt><a href="/pkg/encoding/json/">encoding/json</a></dt>
  <dd>
    <p><!-- CL 234818 -->
      TODO: <a href="https://golang.org/cl/234818">https://golang.org/cl/234818</a>: allow semicolon in field key / struct tag
    </p>
  </dd>
</dl><!-- encoding/json -->

<dl id="encoding/xml"><dt><a href="/pkg/encoding/xml/">encoding/xml</a></dt>
  <dd>
    <p><!-- CL 264024 -->
      The encoder has always taken care to avoid using namespace prefixes
      beginning with <code>xml</code>, which are reserved by the XML
      specification.
      Now, following the specification more closely, that check is
      case-insensitive, so that prefixes beginning
      with <code>XML</code>, <code>XmL</code>, and so on are also
      avoided.
    </p>
  </dd>
</dl><!-- encoding/xml -->

<dl id="flag"><dt><a href="/pkg/flag/">flag</a></dt>
  <dd>
    <p><!-- CL 240014 -->
      TODO: <a href="https://golang.org/cl/240014">https://golang.org/cl/240014</a>: add Func
    </p>
  </dd>
</dl><!-- flag -->

<dl id="io"><dt><a href="/pkg/io/">io</a></dt>
  <dd>
    <p><!-- CL 261577 -->
      TODO: <a href="https://golang.org/cl/261577">https://golang.org/cl/261577</a>: add a new ReadSeekCloser interface
    </p>
  </dd>
</dl><!-- io -->

<dl id="log"><dt><a href="/pkg/log/">log</a></dt>
  <dd>
    <p><!-- CL 264460 -->
      TODO: <a href="https://golang.org/cl/264460">https://golang.org/cl/264460</a>: expose std via new Default function
    </p>
  </dd>
</dl><!-- log -->

<dl id="log/syslog"><dt><a href="/pkg/log/syslog/">log/syslog</a></dt>
  <dd>
    <p><!-- CL 264297 -->
      TODO: <a href="https://golang.org/cl/264297">https://golang.org/cl/264297</a>: set local to true if network is any of &#34;unix&#34;, or &#34;unixgram&#34;
    </p>
  </dd>
</dl><!-- log/syslog -->

<dl id="mime/multipart"><dt><a href="/pkg/mime/multipart/">mime/multipart</a></dt>
  <dd>
    <p><!-- CL 247477 -->
      TODO: <a href="https://golang.org/cl/247477">https://golang.org/cl/247477</a>: return overflow errors in Reader.ReadForm
    </p>
  </dd>
</dl><!-- mime/multipart -->

<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
  <dd>
    <p><!-- CL 250357 -->
      The case of I/O on a closed network connection, or I/O on a network
      connection that is closed before any of the I/O completes, can now
      be detected using the new <a href="/pkg/net/#ErrClosed">ErrClosed</a> error.
      A typical use would be <code>errors.Is(err, net.ErrClosed)</code>.
      In earlier releases the only way to reliably detect this case was to
      match the string returned by the <code>Error</code> method
      with <code>"use of closed network connection"</code>.
    </p>

    <p><!-- CL 255898 -->
      In previous Go releases the default TCP listener backlog size on Linux systems,
      set by <code>/proc/sys/net/core/somaxconn</code>, was limited to a maximum of <code>65535</code>.
      On Linux kernel version 4.1 and above, the maximum is now <code>4294967295</code>.
    </p>

    <p><!-- CL 238629 -->
      TODO: <a href="https://golang.org/cl/238629">https://golang.org/cl/238629</a>: prefer /etc/hosts over DNS when no /etc/nsswitch.conf is present
    </p>
  </dd>
</dl><!-- net -->

<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
  <dd>
    <p><!-- CL 233637 -->
      In the <a href="/pkg/net/http/"><code>net/http</code></a> package, the
      behavior of <a href="/pkg/net/http/#StripPrefix"><code>StripPrefix</code></a>
      has been changed to strip the prefix from the request URL's
      <code>RawPath</code> field in addition to its <code>Path</code> field.
      In past releases, only the <code>Path</code> field was trimmed, and so if the
      request URL contained any escaped characters the URL would be modified to
      have mismatched <code>Path</code> and <code>RawPath</code> fields.
      In Go 1.16, <code>StripPrefix</code> trims both fields.
      If there are escaped characters in the prefix part of the request URL the
      handler serves a 404 instead of its previous behavior of invoking the
      underlying handler with a mismatched <code>Path</code>/<code>RawPath</code> pair.
    </p>

    <p><!-- CL 252497 -->
      The <a href="/pkg/net/http/"><code>net/http</code></a> package now rejects HTTP range requests
      of the form <code>"Range": "bytes=--N"</code> where <code>"-N"</code> is a negative suffix length, for
      example <code>"Range": "bytes=--2"</code>. It now replies with a <code>416 "Range Not Satisfiable"</code> response.
    </p>

    <p><!-- CL 256498, golang.org/issue/36990 -->
      Cookies set with <code>SameSiteDefaultMode</code> now behave according to the current
      spec (no attribute is set) instead of generating a SameSite key without a value.
    </p>

    <p><!-- CL 246338 -->
      The <a href="/pkg/net/http/"><code>net/http</code></a> package now uses the new
      <a href="/pkg/crypto/tls#Conn.HandshakeContext"><code>(*tls.Conn).HandshakeContext</code></a>
      with the <a href="/pkg/net/http/#Request"><code>Request</code></a> context
      when performing TLS handshakes in the client or server.
    </p>

    <p><!-- CL 250039 -->
      TODO: <a href="https://golang.org/cl/250039">https://golang.org/cl/250039</a>: set Content-Length:0 for empty PATCH requests as with POST, PATCH
    </p>

    <p><!-- CL 249440 -->
      TODO: <a href="https://golang.org/cl/249440">https://golang.org/cl/249440</a>: match http scheme when selecting http_proxy
    </p>
  </dd>
</dl><!-- net/http -->

<dl id="net/http/httputil"><dt><a href="/pkg/net/http/httputil/">net/http/httputil</a></dt>
  <dd>
    <p><!-- CL 260637 -->
      TODO: <a href="https://golang.org/cl/260637">https://golang.org/cl/260637</a>: flush ReverseProxy immediately if Content-Length is -1
    </p>
  </dd>
</dl><!-- net/http/httputil -->

<dl id="net/smtp"><dt><a href="/pkg/net/smtp/">net/smtp</a></dt>
  <dd>
    <p><!-- CL 247257 -->
      TODO: <a href="https://golang.org/cl/247257">https://golang.org/cl/247257</a>: adds support for the SMTPUTF8 extension
    </p>
  </dd>
</dl><!-- net/smtp -->

<dl id="os"><dt><a href="/pkg/os/">os</a></dt>
  <dd>
    <p><!-- CL 242998 -->
      TODO: <a href="https://golang.org/cl/242998">https://golang.org/cl/242998</a>: export errFinished as ErrProcessDone
    </p>
  </dd>
</dl><!-- os -->

<dl id="os/signal"><dt><a href="/pkg/os/signal/">os/signal</a></dt>
  <dd>
    <p><!-- CL 219640 -->
      TODO: <a href="https://golang.org/cl/219640">https://golang.org/cl/219640</a>: add NotifyContext to cancel context using system signals
    </p>
  </dd>
</dl><!-- os/signal -->

<dl id="path"><dt><a href="/pkg/path/">path</a></dt>
  <dd>
    <p><!-- CL 264397 -->
      TODO: <a href="https://golang.org/cl/264397">https://golang.org/cl/264397</a>: validate patterns in Match, Glob
    </p>
  </dd>
</dl><!-- path -->

<dl id="path/filepath"><dt><a href="/pkg/path/filepath/">path/filepath</a></dt>
  <dd>
    <p><!-- CL 264397 -->
      TODO: <a href="https://golang.org/cl/264397">https://golang.org/cl/264397</a>: validate patterns in Match, Glob
    </p>
  </dd>
</dl><!-- path/filepath -->

<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
  <dd>
    <p><!-- CL 248341 -->
      TODO: <a href="https://golang.org/cl/248341">https://golang.org/cl/248341</a>: support multiple keys in struct tags
    </p>
  </dd>
</dl><!-- reflect -->

<dl id="runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
  <dd>
    <p><!-- CL 37222 -->
      TODO: <a href="https://golang.org/cl/37222">https://golang.org/cl/37222</a>: make stack traces of endless recursion print only top and bottom 50
    </p>

    <p><!-- CL 242258 -->
      TODO: <a href="https://golang.org/cl/242258">https://golang.org/cl/242258</a>: add 24 byte allocation size class
    </p>

    <p><!-- CL 254659 -->
      TODO: <a href="https://golang.org/cl/254659">https://golang.org/cl/254659</a>: implement GODEBUG=inittrace=1 support
    </p>
  </dd>
</dl><!-- runtime -->

<dl id="runtime/debug"><dt><a href="/pkg/runtime/debug/">runtime/debug</a></dt>
  <dd>
    <p><!-- CL 249677 -->
      The <a href="/pkg/runtime#Error"><code>runtime.Error</code> values
      used when <code>SetPanicOnFault</code> is enabled may now have an
      <code>Addr</code> method. If that method exists, it returns the memory
      address that triggered the fault.
    </p>
  </dd>
</dl><!-- runtime/debug -->

<dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt>
  <dd>
    <p><!-- CL 260858 -->
      <a href="/pkg/strconv/#ParseFloat"><code>ParseFloat</code></a> now uses
      the <a
      href="https://nigeltao.github.io/blog/2020/eisel-lemire.html">Eisel-Lemire
      algorithm</a>, improving performance by up to a factor of 2. This can
      also speed up decoding textual formats like <a
      href="/pkg/encoding/json/"><code>encoding/json</code></a>.
    </p>
  </dd>
</dl><!-- strconv -->

<dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt>
  <dd>
    <p><!-- CL 261917 -->
      <a href="/pkg/syscall/#SysProcAttr"><code>SysProcAttr</code></a> on Windows has a new NoInheritHandles field that disables inheriting handles when creating a new process.
    </p>

    <p><!-- CL 269761, golang.org/issue/42584 -->
      <a href="/pkg/syscall/#DLLError"><code>DLLError</code></a> on Windows now has an Unwrap function for unwrapping its underlying error.
    </p>

    <p><!-- CL 210639 -->
      TODO: <a href="https://golang.org/cl/210639">https://golang.org/cl/210639</a>: support POSIX semantics for Linux syscalls
    </p>
  </dd>
</dl><!-- syscall -->

<dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt>
  <dd>
    <p><!-- CL 254257, golang.org/issue/29770 -->
      Newlines characters are now allowed inside action delimiters,
      permitting actions to span multiple lines.
    </p>
  </dd>
</dl><!-- text/template -->

<dl id="text/template/parse"><dt><a href="/pkg/text/template/parse/">text/template/parse</a></dt>
  <dd>
    <p><!-- CL 229398, golang.org/issue/34652 -->
      A new <a href="/pkg/text/template/parse/#CommentNode"><code>CommentNode</code></a>
      was added to the parse tree. The <a href="/pkg/text/template/parse/#Mode"><code>Mode</code></a>
      field in the <code>parse.Tree</code> enables access to it.
    </p>
  </dd>
</dl><!-- text/template/parse -->

<dl id="time/tzdata"><dt><a href="/pkg/time/tzdata/">time/tzdata</a></dt>
  <dd>
    <p><!-- CL 261877 -->
      The slim timezone data format is now used for the timezone database in
      <code>$GOROOT/lib/time/zoneinfo.zip</code> and the embedded copy in this
      package. This reduces the size of the timezone database by about 350 KB.
    </p>
  </dd>
</dl><!-- time/tzdata -->

<dl id="unicode"><dt><a href="/pkg/unicode/">unicode</a></dt>
  <dd>
    <p><!-- CL 248765 -->
      The <a href="/pkg/unicode/"><code>unicode</code></a> package and associated
      support throughout the system has been upgraded from Unicode 12.0.0 to
      <a href="https://www.unicode.org/versions/Unicode13.0.0/">Unicode 13.0.0</a>,
      which adds 5,930 new characters, including four new scripts, and 55 new emoji.
      Unicode 13.0.0 also designates plane 3 (U+30000-U+3FFFF) as the tertiary
      ideographic plane.
    </p>
  </dd>
</dl><!-- unicode -->
